package com.chenjun.common.util.email;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

import com.chenjun.common.util.ConfigUtil;

/**
 * Send email
 * @author ALLEN
 *
 */
public class SendEmail {
	/**  
     * 以文本格式发送邮件  
     * @param mailInfo 待发送的邮件的信息  
     */   
       public static boolean sendTextMail(String toAddress,String title,String content) {   
         MyAuthenticator authenticator = null;   
         SendEmailInfo mailInfo = new SendEmailInfo();
         mailInfo.setMailServerHost(ConfigUtil.getValue("","email.host"));   
         mailInfo.setMailServerPort(ConfigUtil.getValue("","email.port"));   
         mailInfo.setValidate(true);   
         mailInfo.setUserName(ConfigUtil.getValue("","email.username"));   
         mailInfo.setPassword(ConfigUtil.getValue("","email.password"));//您的邮箱密码   
         mailInfo.setFromAddress(ConfigUtil.getValue("","email.username"));   
         mailInfo.setToAddress(toAddress);   
         mailInfo.setSubject(title);   
         mailInfo.setContent(content);   
            //这个类主要来发送邮件  
         Properties pro = mailInfo.getProperties();  
         if (mailInfo.isValidate()) {    
           authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());   
         }  
         // 根据邮件会话属性和密码验证器构造一个发送邮件的session   
         Session sendMailSession = Session.getDefaultInstance(pro,authenticator);   
         try {   
         // 根据session创建一个邮件消息   
         Message mailMessage = new MimeMessage(sendMailSession);   
         // 创建邮件发送者地址   
         Address from = new InternetAddress(mailInfo.getFromAddress());   
         // 设置邮件消息的发送者   
         mailMessage.setFrom(from);   
         // 创建邮件的接收者地址，并设置到邮件消息中   
         Address to = new InternetAddress(mailInfo.getToAddress());   
         mailMessage.setRecipient(Message.RecipientType.TO,to);   
         // 设置邮件消息的主题   
         mailMessage.setSubject(mailInfo.getSubject());   
         // 设置邮件消息发送的时间   
         mailMessage.setSentDate(new Date());   
         // 设置邮件消息的主要内容   
         String mailContent = mailInfo.getContent();   
         mailMessage.setText(mailContent);   
         // 发送邮件   
         Transport.send(mailMessage);  
         return true;   
         } catch (MessagingException ex) {   
             ex.printStackTrace();   
         }   
         return false;   
       }   
         
       /**  
         * 以HTML格式发送邮件  
         * @param mailInfo 待发送的邮件信息  
         */   
       public static boolean sendHtmlMail(String toAddress,String title,String content){   
         MyAuthenticator authenticator = null;  
         SendEmailInfo mailInfo = new SendEmailInfo();
         mailInfo.setMailServerHost(ConfigUtil.getValue("","email.host"));   
         mailInfo.setMailServerPort(ConfigUtil.getValue("","email.port"));   
         mailInfo.setValidate(true);   
         mailInfo.setUserName(ConfigUtil.getValue("","email.username"));   
         mailInfo.setPassword(ConfigUtil.getValue("","email.password"));//您的邮箱密码   
         mailInfo.setFromAddress(ConfigUtil.getValue("","email.username"));   
         mailInfo.setToAddress(toAddress);   
         mailInfo.setSubject(title);   
         mailInfo.setContent(content);   
         Properties pro = mailInfo.getProperties();  
         //如果需要身份认证，则创建一个密码验证器    
         if (mailInfo.isValidate()) {   
           authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());  
         }   
         // 根据邮件会话属性和密码验证器构造一个发送邮件的session   
         Session sendMailSession = Session.getDefaultInstance(pro,authenticator);   
         try {   
         // 根据session创建一个邮件消息   
         Message mailMessage = new MimeMessage(sendMailSession);   
         // 创建邮件发送者地址   
         Address from = new InternetAddress(mailInfo.getFromAddress());   
         // 设置邮件消息的发送者   
         mailMessage.setFrom(from);   
         // 创建邮件的接收者地址，并设置到邮件消息中   
         Address to = new InternetAddress(mailInfo.getToAddress());   
         // Message.RecipientType.TO属性表示接收者的类型为TO   
         mailMessage.setRecipient(Message.RecipientType.TO,to);   
         // 设置邮件消息的主题   
         mailMessage.setSubject(mailInfo.getSubject());   
         // 设置邮件消息发送的时间   
         mailMessage.setSentDate(new Date());   
         // MiniMultipart类是一个容器类，包含MimeBodyPart类型的对象   
         Multipart mainPart = new MimeMultipart();   
         // 创建一个包含HTML内容的MimeBodyPart   
         BodyPart html = new MimeBodyPart();   
         // 设置HTML内容   
         html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");   
         mainPart.addBodyPart(html);   
         // 将MiniMultipart对象设置为邮件内容   
         mailMessage.setContent(mainPart);   
         // 发送邮件   
         Transport.send(mailMessage);   
         return true;   
         } catch (MessagingException ex) {   
             ex.printStackTrace();   
         }   
         return false;   
       }
       
       /**
        * 
        * 
        * @author zhangzhanwen
        *   发送带附件的邮件 
        * @param toAddress
        * @param title
        * @param content
        * @param attachment
        * @return
        */
      
       public static boolean sendAttachmentEmail(String toAddress,String title,String content,List<File> attachment)
       {
           
    	   boolean flag = true;
    	   MyAuthenticator authenticator = null;  
           SendEmailInfo mailInfo = new SendEmailInfo();
           mailInfo.setMailServerHost(ConfigUtil.getValue("","email.host"));   
           mailInfo.setMailServerPort(ConfigUtil.getValue("","email.port"));   
           mailInfo.setValidate(true);   
           mailInfo.setUserName(ConfigUtil.getValue("","email.username"));   
           mailInfo.setPassword(ConfigUtil.getValue("","email.password"));//您的邮箱密码   
           mailInfo.setFromAddress(ConfigUtil.getValue("","email.username"));   
           mailInfo.setToAddress(toAddress);   
           mailInfo.setSubject(title);   
           mailInfo.setContent(content);   
           Properties pro = mailInfo.getProperties();  
           //如果需要身份认证，则创建一个密码验证器    
           if (mailInfo.isValidate()) {   
             authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());  
           }   
           // 根据邮件会话属性和密码验证器构造一个发送邮件的session   
           Session sendMailSession = Session.getDefaultInstance(pro,authenticator);  
     
           try {
        	   
        	  Message mailMessage = new MimeMessage(sendMailSession); 
        	  mailMessage.setFrom(new InternetAddress(authenticator.getUserName()));
        	  mailMessage.setSubject(title);
        	  mailMessage.setRecipient(RecipientType.TO, new InternetAddress(toAddress));
   			  Multipart multipart = new MimeMultipart();
   			  BodyPart contentPart = new MimeBodyPart();
   			  contentPart.setContent(content.toString(), "text/html;charset=UTF-8");
   			  multipart.addBodyPart(contentPart);
   			  for(File file :attachment)
   			  {
   				BodyPart attachmentBodyPart = new MimeBodyPart();
   				DataSource source = new FileDataSource(file);
   				attachmentBodyPart.setDataHandler(new DataHandler(source));
   				attachmentBodyPart.setFileName(MimeUtility.encodeWord(file.getName()));
   	            multipart.addBodyPart(attachmentBodyPart);
   			  }
   			  
   			  mailMessage.setContent(multipart);
   			  mailMessage.saveChanges();      
              Transport.send(mailMessage);
   			
   		   } catch (AddressException e) {
   			// TODO Auto-generated catch block
   			 flag = false;
   			 e.printStackTrace();
   		   } catch (MessagingException e) {
   			// TODO Auto-generated catch block
   			  flag = false;
   			  e.printStackTrace();
   		   } catch (UnsupportedEncodingException e) {
   			// TODO Auto-generated catch block
   			flag = false;
   			e.printStackTrace();
   		  } 
       	 
       	  return flag;  
       }
    
   }   

